package com.bigdata

object Demo4Fun {

  def main(args: Array[String]): Unit = {
    /**
     * scala 是一门面向函数编程的语言
     * 函数的定义  -- 函数可以在任何位置定义, 要在object 或者 class内定义
     * 1、函数可以定义在object中，object中的函数可以直接调用
     * 2、可以在方法或者函数内部定义函数
     */
    /**
     * 函数的调用
     */
    // 使用object名称调用
    val num1: Int = Demo4Fun.add(10, 20)
    println(num1)

    // 如果函数在同一个object内，可以直接使用函数名
    val num2: Int = add(30, 40)
    println(num2)

    // main函数中嵌套了一个函数
    def sub(x: Int, y: Int): Int = {
      return x - y
    }

    val num3: Int = sub(20, 10)
    println(num3)

    //方法调用的简写
    val str: String = "hadoop,hive,hbase,spark"
    val arr: Array[String] = str.split(",")
    println(arr.mkString("-"))

    // 省略了.和小括号
    println(str split "," mkString "-")

    println(mul3(2, 3))

    // 调用无参的函数,可以省略小括号
    show()
    show

    // 定义的时候没有括号，调用的时候就不能加了
    show1

  }

  // 2个int值相加，返回累加之后的结果
  def add(x: Int, y: Int): Int = {
    return x + y
  }

  /**
   * 函数的简写
   * 1、如果追后一行作为返回值，return可以省略
   * 2、如果函数的代码逻辑之后一行，{} 可以省略
   * 3、返回值的类型可以自动推断
   * 4、如果参数列表为空  ()可以不写,  如果定义时没有括号，调用时也不能有括号
   */
  def mul(x: Int, y: Int): Int = {
    return x * y
  }

  // 最后一行的数据类型和函数的返回值类型一致，可以省略return
  def mul1(x: Int, y: Int): Int = {
    x * y
  }

  // 只有一行代码可以省略{}
  def mul2(x: Int, y: Int): Int =
    x * y

  // 可以根据返回值自动推断函数的返回值类型
  def mul3(x: Int, y: Int) =
    x * y

  // 如果参数列表为空  ()可以不写,  如果定义时没有括号，调用时也不能有括号
  def show(): Unit = {
    println("show....")
  }

  def show1: Unit = {
    println("show1....")
  }


}
